인프라 구조
code push
Git 레포지토리에 애플리케이션 코드를 푸시하는 단계로 이는 CI/CD 파이프라인의 시작점이다.
push image
GitHub Actions이 애플리케이션 코드를 Docker 이미지로 빌드하고, Amazon ECR(AWS Elastic Container Registry)에 이미지를 푸시하는 단계다.
deploy
push된 새로운 버전의 이미지를 배포하는 단계다. 이때 업데이트는 롤링 업데이트 방식을 사용할 예정이다. 그 이유는 가장 무중단 배포 방식이기 때문이다.
현재 팀에선 비용과 시간을 최대한 가볍게 가져가는 것이 중요하기 때문에 위 CI/CD 단계는 최대한 간단하게 Github Actions를 이용할 예정이다.
간단한 API 서버 구축
Member.java
@Entity
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}MemberController.java
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberRepository memberRepository;
@GetMapping
public List<MemberDto> test() {
return memberRepository.findAll()
.stream()
.map(MemberDto::toDto)
.toList();
}
}MemberDto.java
public record MemberDto(String name) {
public static MemberDto toDto(final Member member) {
return new MemberDto(member.getName());
}
}MemberRepository.java
public interface MemberRepository extends JpaRepository<Member, Long> {
}RDS 연결을 위해 다소 억지스러울 수 있는 API 서버를 구축했다. 요청을 보내면, DB에 저장된 member의 데이터를 반환하는 API를 제공한다.
이제 API 서버를 image로 빌드할 dockerfile을 작성해보자.
FROM gradle:7.6.1-jdk17 AS build
WORKDIR /app
COPY build.gradle settings.gradle ./
RUN gradle dependencies --no-daemon
COPY . /app
RUN gradle clean build --no-daemon
FROM openjdk:17-slim
WORKDIR /app
COPY /app/build/libs/*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java"]
CMD ["-jar", "app.jar"]위처럼 멀티 스테이지 빌드를 사용하면, docker image 크기를 줄임으로써 배포 환경에서 보다 가볍고 빠르게 서버가 구동될 수 있다.
위 Dockerfile을 이용하면, 만든 spring boot application을 이미지로 빌드할 수 있다.